package Vista;

import Abstracto.Observado;
import Abstracto.Vista;
import Modelo.Celula;
import Modelo.EstadisticaAbstracta;
import Modelo.JPanelConFondo;
import Modelo.Tejido;
import Modelo.Vertice;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

public class GraficoBarras extends Vista implements EstadisticaAbstracta{

    private BufferedImage grafica = null;
    private ArrayList<String[]> listaResultados = null;

    /**
     * Creates new form GraficoBarras.
     */
    public GraficoBarras(Tejido tejido) {
        interfaz = new JFrame("Estadisticas Tejido.");
        initComponents();
        interfaz.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.tejido = tejido;
        graficar();
    }

    public BufferedImage creaImagen() {
        DefaultCategoryDataset modelo = new DefaultCategoryDataset();
        // column keys...
        int[] numeroCelulas = new int[20];
        for (int i = 0; i < numeroCelulas.length; i++) {
            numeroCelulas[i] = 0;
        }
        ArrayList<Vertice<Celula>> lista = tejido.getTejidoG().getLista_vertices();
        for (int i = 0; i < tejido.getTejidoG().getLista_vertices().size(); i++) {
            numeroCelulas[lista.get(i).getInfo().getNumLado()]++;
            //System.out.println(i + ". " + lista.get(i).getInfo().getId() + " " + lista.get(i).getInfo().getNumLado());
        }

        listaResultados = new ArrayList<>();

        for (int i = 0; i < numeroCelulas.length; i++) {
            if (numeroCelulas[i] != 0) {
                String[] valores = new String[2];
                valores[0] = i + "";
                valores[1] = numeroCelulas[i] + "";
                listaResultados.add(valores);
                modelo.addValue(numeroCelulas[i], tejido.getNombre(), i + " lados");
            }
        }

        boolean legend = true;
        boolean tooltips = true;
        boolean urls = false;
        JFreeChart chart = ChartFactory.createBarChart(
                "Celulas por numero de lados",
                "Numero de Lados",
                "Cantidad de celulas",
                modelo,
                PlotOrientation.VERTICAL,
                legend,
                tooltips,
                urls);
        return chart.createBufferedImage(interfaz.getSize().width - 400, interfaz.getSize().height - 100);
    }

    public void graficar() {
        if (grafica == null && tejido != null) {
            grafica = this.creaImagen();
            interfaz.setIconImage(grafica);
            JPanelConFondo contenedor = new JPanelConFondo(grafica, imprimirResultados());
            interfaz.setContentPane(contenedor); 
            arranca();
        }
    }

    public String[] imprimirResultados() {
        String[] lst = new String[listaResultados.size()];
        for (int i = 0; i < listaResultados.size(); i++) {
            lst[i] = "Numero de celulas de " + listaResultados.get(i)[0] + " lados: " + listaResultados.get(i)[1];

        }
        return lst;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        interfaz.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(interfaz.getContentPane());
        interfaz.getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 580, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 394, Short.MAX_VALUE)
        );

        interfaz.pack();
    }// </editor-fold>//GEN-END:initComponents

    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
    @Override
    public void alistar() {
    }

    @Override
    public void arranca() {
        interfaz.setVisible(true);
    }

    @Override
    public void termina() {
        interfaz.dispose();
    }

    @Override
    public void update(Observado o) {
    }
}
